if (!dojo._hasResource["dojo.dnd.TimedMoveable"]) { //_hasResource checks added by build. Do not use _hasResource directly in your code.
    dojo._hasResource["dojo.dnd.TimedMoveable"] = true;
    dojo.provide("dojo.dnd.TimedMoveable");

    dojo.require("dojo.dnd.Moveable");

    (function() {
        // precalculate long expressions
        var oldOnMove = dojo.dnd.Moveable.prototype.onMove;

        dojo.declare("dojo.dnd.TimedMoveable", dojo.dnd.Moveable, {
            // summary:
            //	A specialized version of Moveable to support an FPS throttling.
            //	This class puts an upper restriction on FPS, which may reduce
            //	the CPU load. The additional parameter "timeout" regulates
            //	the delay before actually moving the moveable object.

            // object attributes (for markup)
            timeout: 40,    // in ms, 40ms corresponds to 25 fps

            constructor: function(node, params) {
                // summary: an object, which makes a node moveable with a timer
                // node: Node: a node (or node's id) to be moved
                // params: Object: an optional object with additional parameters.
                //	See dojo.dnd.Moveable for details on general parameters.
                //	Following parameters are specific for this class:
                //		timeout: Number: delay move by this number of ms
                //			accumulating position changes during the timeout

                // sanitize parameters
                if (!params) {
                    params = {};
                }
                if (params.timeout && typeof params.timeout == "number" && params.timeout >= 0) {
                    this.timeout = params.timeout;
                }
            },

            // markup methods
            markupFactory: function(params, node) {
                return new dojo.dnd.TimedMoveable(node, params);
            },

            onMoveStop: function(/* dojo.dnd.Mover */ mover) {
                if (mover._timer) {
                    // stop timer
                    clearTimeout(mover._timer)
                    // reflect the last received position
                    oldOnMove.call(this, mover, mover._leftTop)
                }
                dojo.dnd.Moveable.prototype.onMoveStop.apply(this, arguments);
            },
            onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop) {
                mover._leftTop = leftTop;
                if (!mover._timer) {
                    var _t = this;	// to avoid using dojo.hitch()
                    mover._timer = setTimeout(function() {
                        // we don't have any pending requests
                        mover._timer = null;
                        // reflect the last received position
                        oldOnMove.call(_t, mover, mover._leftTop);
                    }, this.timeout);
                }
            }
        });
    })();

}
